/**
 * Copyright (C), 2018-2018,成都亿阳信通
 * 文件名: ZuulPreFilter
 * 创建人:   yag
 * 创建时间:     2018/12/26 0026 9:17
 * 描述: zuul 前置过滤器 pre
 * 历史信息:
 * <作者>          <更新时间>                    <版本>          <版本描述>
 * yag           2018/12/26 0026 9:17         v1.0.0.0              创建基础
 */
package com.example.zuul.config;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;

import javax.servlet.http.HttpServletRequest;

/**
 * 〈一句话功能简述〉 类<br> 
 * 〈zuul 前置过滤器 pre〉
 *
 * @author yag
 * @create 2018/12/26 0026 9:17
 * @since 1.0.0
 */
@Slf4j
public class ZuulPreFilter extends  ZuulFilter {
    private static final String RESPONSE_KEY_TOKEN = "token";
    /**
     * 过滤器类型
     * 顺序: pre ->routing -> post ,以上3个顺序出现异常时都可以触发error类型的filter
     * @return
     */
    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    /**
     * 同filterType类型中，order值越大，优先级越
     * @return
     */
    @Override
    public int filterOrder() {
        return 1;
    }

    /**
     * 是否应该执行该过滤器，如果是false，则不执行该filter
     * @return
     */
    @Override
    public boolean shouldFilter() {
        return true;
    }

    /**
     *  执行业务操作，可执行sql,nosql等业务
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
            RequestContext context = RequestContext.getCurrentContext();

            HttpServletRequest request = context.getRequest();
            String tiebieUrl= request.getRequestURL().toString();
            log.info(String.format("%s ZuulPreFilter request to %s", request.getMethod(), tiebieUrl));
            log.info("自定义ZUUL 过滤器启动，");
            // 获取请求的参数
            String token = request.getParameter("token");
            String noControlStr="oauth/token";
                // 如果请求的参数不为空，且值为chhliu时，则通过
            if(StringUtils.isNotBlank(token)
                        || (StringUtils.isNotBlank(tiebieUrl) && (tiebieUrl.contains(noControlStr)
                                || tiebieUrl.contains("v2/api-docs")
                                || tiebieUrl.contains("swagger-ui")
                                || tiebieUrl.contains("swagger-resources")
                                || tiebieUrl.contains("webjars")
                                    )
                            )
                ) {
                // 对该请求进行路由
                context.setSendZuulResponse(true);
                context.setResponseStatusCode(200);
                // 设值，让下一个Filter看到上一个Filter的状态
                context.set("isSuccess", true);
                return null;
            }else{
                // 过滤该请求，不对其进行路由
                context.setSendZuulResponse(false);
                // 返回错误码
                context.setResponseStatusCode(401);
                // 返回错误内容
                context.setResponseBody("{\"result\":\"username is not correct!\"}");
                context.set("isSuccess", false);
                return null;
            }

    }
}
